package com.cloud.adrian.novel.book.feign;

import com.cloud.adrian.novel.book.dto.req.*;
import com.cloud.adrian.novel.book.dto.resp.BookChapterContentRespDto;
import com.cloud.adrian.novel.book.dto.resp.BookChapterRespDto;
import com.cloud.adrian.novel.book.dto.resp.BookEsRespDto;
import com.cloud.adrian.novel.book.dto.resp.BookInfoRespDto;
import com.cloud.adrian.novel.common.constant.ApiRouterConstants;
import com.cloud.adrian.novel.common.constant.ErrorCodeEnum;
import com.cloud.adrian.novel.common.resp.PageRespDto;
import com.cloud.adrian.novel.common.resp.RestResp;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.ArrayList;
import java.util.List;

/**
 * 小说微服务调用客户端
 * @Author: xiangguiliang
 * @version: 1.0
 * @since: 2024/05/16
 */
@Component
@FeignClient(value = "novel-book-service", fallback = BookFeign.BookFeignFallback.class)
public interface BookFeign {

    /**
     * 批量查询小说信息
     * @param bookIds 小说id集合
     * @return 小说信息列表
     */
    @PostMapping(ApiRouterConstants.API_INNER_BOOK_URL_PREFIX + "/listBookInfoByIds")
    RestResp<List<BookInfoRespDto>> listBookInfoByIds(List<Long> bookIds);

    /**
     * 发布小说评论
     * @param dto 评论请求体
     * @return void
     */
    @PostMapping(ApiRouterConstants.API_INNER_BOOK_URL_PREFIX + "/publishComment")
    RestResp<Void> publishComment(BookCommentReqDto dto);

    /**
     * 修改小说评论
     * @param dto 评论请求体
     * @return void
     */
    @PostMapping(ApiRouterConstants.API_INNER_BOOK_URL_PREFIX + "/updateComment")
    RestResp<Void> updateComment(BookCommentReqDto dto);

    /**
     * 删除小说评论
     * @param dto 评论请求体
     * @return void
     */
    @PostMapping(ApiRouterConstants.API_INNER_BOOK_URL_PREFIX + "/deleteComment")
    RestResp<Void> deleteComment(@RequestBody BookCommentReqDto dto);

    /**
     * 查询下一批小说列表
     *
     * @param maxBookId 最大小说id
     * @return 小说列表
     */
    @PostMapping(ApiRouterConstants.API_INNER_BOOK_URL_PREFIX + "/listNextEsBooks")
    RestResp<List<BookEsRespDto>> listNextEsBooks(Long maxBookId);

    /**
     * 发布小说
     * @param dto 小说请求体
     * @return void
     */
    @PostMapping(ApiRouterConstants.API_INNER_BOOK_URL_PREFIX + "/publishBook")
    RestResp<Void> publishBook(BookAddReqDto dto);

    /**
     * 发布小说查询列表
     * @param dto 小说分页请求体
     * @return 小说分页列表
     */
    @PostMapping(ApiRouterConstants.API_INNER_BOOK_URL_PREFIX + "/listPublishBooks")
    RestResp<PageRespDto<BookInfoRespDto>> listPublishBooks(BookPageReqDto dto);

    /**
     * 发布小说章节
     * @param dto 小说章节请求体
     * @return void
     */
    @PostMapping(ApiRouterConstants.API_INNER_BOOK_URL_PREFIX + "/publishBookChapters")
    RestResp<Void> publishBookChapters(ChapterAddReqDto dto);

    /**
     * 查询小说章节列表
     * @param reqDto 小说章节分页请求体
     * @return 小说章节分页列表
     */
    @PostMapping(ApiRouterConstants.API_INNER_BOOK_URL_PREFIX + "/listPublishBookChapters")
    RestResp<PageRespDto<BookChapterRespDto>> listBookChapters(ChapterPageReqDto reqDto);

    /**
     * 查询小说章节内容
     * @param dto 小说章节内容请求体
     * @return 小说章节内容
     */
    @PostMapping(ApiRouterConstants.API_INNER_BOOK_URL_PREFIX + "/getChapterContent")
    RestResp<BookChapterContentRespDto> getChapterContent(ChapterContentReqDto dto);

    /**
     * 跟新小说章节内容
     * @param dto 小说章节内容请求体
     * @return void
     */
    @PostMapping(ApiRouterConstants.API_INNER_BOOK_URL_PREFIX + "/updateChapter")
    RestResp<Void> updateChapter(ChapterAddReqDto dto);

    /**
     * 删除小说章节内容
     * @param dto 小说章节内容请求体
     * @return void
     */
    @PostMapping(ApiRouterConstants.API_INNER_BOOK_URL_PREFIX + "/deleteChapter")
    RestResp<Void> deleteChapter(ChapterContentReqDto dto);

    /**
     * 查询小说信息
     * @param bookId 小说id
     * @return 小说信息
     */
    @PostMapping(ApiRouterConstants.API_INNER_BOOK_URL_PREFIX + "/selectBookById")
    RestResp<BookEsRespDto> selectBookById(Long bookId);

    @Component
    class BookFeignFallback implements BookFeign{
        @Override
        public RestResp<List<BookInfoRespDto>> listBookInfoByIds(List<Long> bookIds) {
            return RestResp.ok(new ArrayList<>(0));
        }

        @Override
        public RestResp<Void> publishComment(BookCommentReqDto dto) {
            return RestResp.fail(ErrorCodeEnum.THIRD_SERVICE_ERROR);
        }

        @Override
        public RestResp<Void> updateComment(BookCommentReqDto dto) {
            return RestResp.fail(ErrorCodeEnum.THIRD_SERVICE_ERROR);
        }

        @Override
        public RestResp<Void> deleteComment(BookCommentReqDto dto) {
            return RestResp.fail(ErrorCodeEnum.THIRD_SERVICE_ERROR);
        }

        @Override
        public RestResp<List<BookEsRespDto>> listNextEsBooks(Long maxId) {
            return RestResp.ok(new ArrayList<>(0));
        }

        @Override
        public RestResp<Void> publishBook(BookAddReqDto dto) {
            return RestResp.fail(ErrorCodeEnum.THIRD_SERVICE_ERROR);
        }

        @Override
        public RestResp<PageRespDto<BookInfoRespDto>> listPublishBooks(BookPageReqDto dto) {
            return RestResp.ok(PageRespDto.of(dto.getPageNum(), dto.getPageSize(), 0, new ArrayList<>(0)));
        }

        @Override
        public RestResp<Void> publishBookChapters(ChapterAddReqDto dto) {
            return RestResp.fail(ErrorCodeEnum.THIRD_SERVICE_ERROR);
        }

        @Override
        public RestResp<PageRespDto<BookChapterRespDto>> listBookChapters(ChapterPageReqDto reqDto) {
            return RestResp.ok(PageRespDto.of(reqDto.getPageNum(), reqDto.getPageSize(), 0, new ArrayList<>(0)));
        }

        @Override
        public RestResp<BookChapterContentRespDto> getChapterContent(ChapterContentReqDto id) {
            return RestResp.ok(BookChapterContentRespDto.builder().build());
        }

        @Override
        public RestResp<Void> updateChapter(ChapterAddReqDto dto) {
            return RestResp.fail(ErrorCodeEnum.THIRD_SERVICE_ERROR);
        }

        @Override
        public RestResp<Void> deleteChapter(ChapterContentReqDto dto) {
            return RestResp.fail(ErrorCodeEnum.THIRD_SERVICE_ERROR);
        }

        @Override
        public RestResp<BookEsRespDto> selectBookById(Long bookId) {
            return RestResp.ok(BookEsRespDto.builder().build());
        }
    }
}
